package main

import (
	"bufio"
	"fmt"
	"io"
	"log"
	"net"
	"os"
	client_stream "send_file/grpc_proto/client_stream"

	"google.golang.org/grpc"
	"google.golang.org/grpc/grpclog"
)

type FileUploadService struct {
	client_stream.UnimplementedClientStreamServer
}

func (f FileUploadService) UploadFile(req client_stream.ClientStream_UploadFileServer) error {
	// 这里文件名我们写死了，实际应该用客户端传过来的
	file, err := os.OpenFile("2.jpg", os.O_CREATE|os.O_WRONLY, 0600)
	if err != nil {
		log.Fatalln(err)
	}
	defer file.Close()

	writer := bufio.NewWriter(file)

	for {
		recv, err := req.Recv()
		if err == io.EOF {
			break
		}
		fmt.Println(fmt.Sprintf("写入数据 %d 字节", len(recv.Content)))
		writer.Write(recv.Content)
	}

	writer.Flush()

	// 注意方法上响应只有error，response是从这里返回的，而没有写在方法上
	req.SendAndClose(&client_stream.Response{Text: "服务端接收完成啦！"})
	return nil
}

func main() {
	// 监听端口
	listen, err := net.Listen("tcp", ":8080")
	if err != nil {
		grpclog.Fatalf("Failed to listen err:%v", err)
	}

	// 创建一个grpc服务器实例
	s := grpc.NewServer()
	server := FileUploadService{}

	// 将server结构体注册为grpc服务
	client_stream.RegisterClientStreamServer(s, &server)
	fmt.Println("grpc server running:8080")

	// 开始处理客户端请求
	err = s.Serve(listen)
}
